#include <iostream>
#include <string>
using namespace std;

/*
    模板的显式具体化和隐式实例化
        模板的显式具体化：显式--》光明正大，赤裸裸
                                              函数模板本来可以针对所有的数据类型，但是有些数据类型该函数模板代码无法处理，此时就必须把这些特殊的类型单独定义一个具体化的版本
        模板的隐式实例化：隐式--》偷偷摸摸，不经意
                        当我们调用函数模板的时候，传递的实参类型，编译器会自动帮你生成对应版本的函数，这个生成过程我们程序员不可见(对应程序员的是透明的)，因此老外就把这个过程叫做函数模板的隐式实例化
                            T add(T a,T b)
                            add(12,45);  //编译器就偷偷摸摸帮你生成了int版本的add(隐式实例化了int版本的add)
        (1)模板函数显式具体化的语法
            template<typename T>
            T fun(T n)     //除string之外的其他类型
            {

            }
            template<>
            string  fun(string n)  //专门针对string的fun
            {
                具体代码
            }
        (2)模板类显式具体化的语法
            template<typename T>
            class Array               //除string之外的其他类型
            {

            }
            template<>
            class Array<string> //专门针对string的 Array<string>
            {
                具体代码
            }
*/

struct Student
{
    string name;
    int age;
};

template <typename T>
T fun(T n)
{
    return n * n;
}

template <>
string fun(string n)
{
    return n + n;
}

template <>
Student fun(struct Student s)
{
    s.age = 18;
    return s;
}

int main()
{
    Student s;
    s.age = 20;
    s.name = "hello";
    cout << fun(s).age << endl;

    int a = 12;
    string b = "hello";
    cout << fun(a) << endl;
    cout << fun(b) << endl;
}